﻿using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioUsuario : IRepositorioUsuario
    {
        public Usuario Inserir(Usuario usuario)
        {
            Usuario tmpUsuario = new Usuario();
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpUsuario.Login = usuario.Login;
            tmpUsuario.Senha = usuario.Senha;
            tmpUsuario.Foto = usuario.Foto;
            tmpUsuario.Pessoa = usuario.Pessoa;
            tmpUsuario.FimVigencia = usuario.FimVigencia.HasValue ? usuario.FimVigencia.Value.Date : usuario.FimVigencia;
            tmpUsuario.InicioVigencia = usuario.InicioVigencia.HasValue ? usuario.InicioVigencia.Value.Date : usuario.FimVigencia;

            tmpUsuario.ListaSistemaPerfilUsuario.Clear();
            SistemaPerfilUsuario sistemaPerfilUsuarioTmp;
            foreach (SistemaPerfilUsuario sistemaPerfilUsuario in usuario.ListaSistemaPerfilUsuario)
            {
                sistemaPerfilUsuarioTmp = new SistemaPerfilUsuario();
                sistemaPerfilUsuarioTmp.SistemaPerfil = sistemaPerfilUsuario.SistemaPerfil;
                sistemaPerfilUsuarioTmp.Usuario = sistemaPerfilUsuario.Usuario;
                sistemaPerfilUsuarioTmp.SistemaPerfilUsuarioId = sistemaPerfilUsuario.SistemaPerfilUsuarioId;

                sistemaPerfilUsuarioTmp.ListaTelaAcaoUsuario.Clear();
                foreach (TelaAcaoUsuario telaAcaoUsuario in sistemaPerfilUsuario.ListaTelaAcaoUsuario)
                {
                    sistemaPerfilUsuarioTmp.AdicionarTelaAcaoUsuario(telaAcaoUsuario);
                }

                tmpUsuario.AdicionarSistemaPerfilUsuario(sistemaPerfilUsuarioTmp);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(tmpUsuario);
            return tmpUsuario;
        }

        public Usuario Atualizar(Usuario usuario)
        {
            //Usuario tmpUsuario = ObterPorId(usuario.UsuarioId);
            //// Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            //tmpUsuario.Login = usuario.Login;
            //tmpUsuario.Senha = usuario.Senha;
            //tmpUsuario.Foto = usuario.Foto;
            //tmpUsuario.FimVigencia = usuario.FimVigencia.HasValue ? usuario.FimVigencia.Value.Date : usuario.FimVigencia;
            //tmpUsuario.InicioVigencia = usuario.InicioVigencia.HasValue ? usuario.InicioVigencia.Value.Date : usuario.FimVigencia;
            //tmpUsuario.Pessoa = usuario.Pessoa;
            //tmpUsuario.ListaSistemaPerfilUsuario.Clear();
            //SistemaPerfilUsuario sistemaPerfilUsuarioTmp;
            //foreach (SistemaPerfilUsuario sistemaPerfilUsuario in usuario.ListaSistemaPerfilUsuario)
            //{
            //    sistemaPerfilUsuarioTmp = new SistemaPerfilUsuario();
            //    sistemaPerfilUsuarioTmp.SistemaPerfil = sistemaPerfilUsuario.SistemaPerfil;
            //    sistemaPerfilUsuarioTmp.Usuario = sistemaPerfilUsuario.Usuario;
            //    sistemaPerfilUsuarioTmp.SistemaPerfilUsuarioId = sistemaPerfilUsuario.SistemaPerfilUsuarioId;

            //    sistemaPerfilUsuarioTmp.ListaTelaAcao.Clear();
            //    foreach (TelaAcao telaAcao in sistemaPerfilUsuario.ListaTelaAcao)
            //    {
            //        sistemaPerfilUsuarioTmp.AdicionarTelaAcao(telaAcao);
            //    }

            //    tmpUsuario.AdicionarSistemaPerfilUsuario(sistemaPerfilUsuarioTmp);
            //}
            
            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(usuario);
            return usuario;
        }

        public void Excluir(Usuario usuario)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(usuario);
        }

        public IList<Usuario> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (Usuario));
            return criteria.List<Usuario>() as List<Usuario>;
        }

        public IList<Usuario> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string login, DateTime? inicioVigenciaDe, DateTime? inicioVigenciaAte, DateTime? fimVigenciaDe,
                                            DateTime? fimVigenciaAte, Sistema sistema)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Usuario))
                .SetFirstResult(inicio).SetMaxResults(quantidade);
            
            if(!string.IsNullOrEmpty(login))
            {
                criteria.Add(Restrictions.Eq("Login", login));
            }

            if ((inicioVigenciaDe.HasValue) && (inicioVigenciaAte.HasValue))
            {
                criteria.Add(Restrictions.Between("InicioVigencia", inicioVigenciaDe.Value.Date, inicioVigenciaAte.Value.Date));
            }

            if ((fimVigenciaDe.HasValue) && (fimVigenciaAte.HasValue))
            {
                criteria.Add(Restrictions.Between("FimVigencia", fimVigenciaDe.Value.Date, fimVigenciaAte.Value.Date));
            }

            //if (sistema != null)
            //{
            //    criteria.CreateAlias("ListaSistemaPerfilUsuario", "SistemaPerfilUsuario")
            //        .CreateAlias("SistemaPerfilUsuario.SistemaPerfil", "SistemaPerfil")
            //        .Add(Restrictions.Eq("SistemaPerfil.Sistema", sistema));
            //}

            return  criteria.List<Usuario>() as List<Usuario>;
        }

        public Usuario ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Usuario>(id);
        }

        public Usuario ObterPorLogin(string login)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Usuario))
                .Add(Restrictions.Eq("Login", login));
            return criteria.UniqueResult<Usuario>();
        }

        public Usuario ObterPorLoginSenha(string login, string senha)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Usuario))
                .Add(Restrictions.Eq("Login", login))
                .Add(Restrictions.Eq("Senha", senha));
            return criteria.UniqueResult<Usuario>();
        }
    }
}